/*
动态数码管实验
多个数码管显示0~F字符
位选使用74HC138
*/

#include"reg52.h"
#define SMG_A_DP_PORT P0 //使用宏定义数码管断码口

//定义数码管位选信号控制脚
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;

typedef unsigned int u16;//对系统默认数据类型进行重定义
typedef unsigned int u8;

void delay_10us(u16 ten_us)//延时函数12MHZ下450ms
{
	while(ten_us--)
	{}
}
//共阴极数码管显示0~F的段码数据，0x00表示什么也不显示
u8 typor[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00};

void smg_display()//动态显示函数
{
	u8 i=0;
	for(i=0;i<8;i++)
	{
	switch(i)//位选
	{
		case 0:	LSA=0;LSB=0;LSC=0;break;
		case 1:	LSA=1;LSB=0;LSC=0;break;
		case 2:	LSA=0;LSB=1;LSC=0;break;
		case 3:	LSA=1;LSB=1;LSC=0;break;
		case 4:	LSA=0;LSB=0;LSC=1;break;
		case 5:	LSA=1;LSB=0;LSC=1;break;
		case 6:	LSA=0;LSB=1;LSC=1;break;
		case 7:	LSA=1;LSB=1;LSC=1;break;
	}
	SMG_A_DP_PORT=typor[i];//传送段选数据
	delay_10us(100);//延时以保持显示稳定
	SMG_A_DP_PORT=0x00;//消隐
	}
}

void main()	
{
	smg_display();
}